#pragma once
#include <memory>
#include <list>
#include <iostream>

class Message;
using MessagePointer = std::shared_ptr<Message>;

class MessageListener;
using MessageListenerPointer = std::shared_ptr<MessageListener>;

class Component;
using ComponentPointer = std::shared_ptr<Component>;

class Application;

class Object;
using ObjectPointer = std::shared_ptr<Object>;
using ObjectWeakPointer = std::weak_ptr<Object>;

class Node;
using NodePointer = std::shared_ptr<Node>;
using NodeWeakPointer = std::weak_ptr<Node>;

class Entity;
using EntityPointer = std::shared_ptr<Entity>;
using EntityWeakPointer = std::weak_ptr<Entity>;

class Sprite;
using SpritePointer = std::shared_ptr<Sprite>;
using SpriteList = std::list<SpritePointer>;

class SpriteDecorator;
using SpriteDecoratorPointer = std::shared_ptr<SpriteDecorator>;

class Animation;
using AnimationPointer = std::shared_ptr<Animation>;

class NodeLayer;

class Tile;
class TileMap;

class Scene;
using ScenePointer = std::shared_ptr<Scene>;
using SceneWeakPointer = std::weak_ptr<Scene>;

class SceneManager;

class SpriteDeleter;
using SpriteDeleterPointer = std::shared_ptr<SpriteDeleter>;

class SpriteController;
using SpriteControllerPointer = std::shared_ptr<SpriteController>;

class State;
using StatePointer = std::shared_ptr<State>;

class StateMachine;

class Action;
using ActionPointer = std::shared_ptr<Action>;

class Background;
using BackgroundPointer = std::shared_ptr<Background>;

class Control;
